/*******************************************************************************
* Имя файла: sixTask.cpp
* Дата: 28-04-2024
* Разработчик: Андрей Подлегаев
* Группа: 315
* Факультет: ЦДО ТУСУР
* Лицензия: BSD
* Описание: Решение задач к лабораторной работе № 6 (ЦДО ТУСУР)
* *****************************************************************************/

#include "sixTask.h"

void topFavoriteBerries()
{
  const int ratingPosition = 3;

  print("Данная программа собирает топ-3 Ваших любимых ягод\n", COLOR_MAGENTA);

  std::map<int, std::string> mapRating;

  std::vector<int> vecCheckInputRating;

  bool successfulInput{false};

  std::string inputCheckRating{};

  for (int i{}; i < ratingPosition; ++i) {
      std::cout << "Пожалуйста, введите рейтинг: ";
      int rating;
      do {
          std::cin >> rating;
          while (std::cin.fail()) {
              std::cin.clear();
              std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
              print("Некорректный ввод!\n", COLOR_RED);
              std::cout << "Пожалуйста, введите рейтинг от 1 до " << ratingPosition << " : ";
              std::cin >> rating;
            }

          if (std::find(vecCheckInputRating.begin(), vecCheckInputRating.end(),
                        rating) != vecCheckInputRating.end()) {
              print("Внимание! Введеный рейтинг существует!\n", COLOR_RED);
              std::cout << "Пожалуйста, введите рейтинг (кроме " << inputCheckRating << ") : ";
              successfulInput = false;
            }
          else if (rating >= 1 && rating <= ratingPosition) {
              successfulInput = true;
              if (inputCheckRating.empty()) {
                  inputCheckRating.append(std::to_string(rating));
                }
              else {
                  inputCheckRating.append(", ");
                  inputCheckRating.append(std::to_string(rating));
                }
            }
          else {
              print("Некорректный ввод!\n", COLOR_RED);
              std::cout << "Пожалуйста, введите рейтинг от 1 до " << ratingPosition << " : ";
              successfulInput = false;
            }

        } while (!successfulInput);

      //TODO Можно сделать проверку на корректность ввода по списку известных ягод
      std::cout << "Пожалуйста, введите название ягоды: ";
      std::string berry;
      std::cin >> berry;
      mapRating[rating] = berry;
      vecCheckInputRating.push_back(rating);
    }

  print("\nТоп-3 Ваших любимых ягод:\n", COLOR_GREEN);

  for (const auto &element : mapRating)
    std::cout << element.first << ". " << element.second << std::endl;
}
